/**
 * 测试修复后的案件生成Agent
 */

import { MastraClient } from '@mastra/client-js';

console.log('🚀 开始测试修复后的案件生成Agent...\n');

const mastraClient = new MastraClient({
  baseUrl: 'http://localhost:4111',
  retries: 3,
  backoffMs: 300,
  maxBackoffMs: 5000,
});

async function testCaseGeneration() {
  try {
    console.log('📋 测试案件生成Agent...');
    
    const agent = mastraClient.getAgent('gameMasterAgent');
    const result = await agent.generateVNext({
      messages: [
        {
          role: 'user',
          content: `请开始一个新的赛博侦探游戏。

游戏配置：
- 难度：normal
- 主题：办公室谋杀案
- 嫌疑人数量：3
- 玩家档案：{"name": "测试侦探", "experience": "中级"}

请使用 game-master 工具执行 start_game 操作，生成完整的案件信息。`
        }
      ]
    });

    console.log('✅ Agent响应成功');
    console.log('📝 响应文本长度:', result.text?.length || 0);
    
    // 等待工具调用完成
    const toolResults = await result.toolResults;
    console.log('🔧 工具调用数量:', toolResults?.length || 0);
    
    if (toolResults && toolResults.length > 0) {
      const toolResult = toolResults[0];
      console.log('🎯 工具调用成功');
      
      if (toolResult.payload?.result) {
        const gameData = toolResult.payload.result;
        console.log('📊 游戏数据结构验证:');
        console.log('- success:', gameData.success);
        console.log('- data存在:', !!gameData.data);
        console.log('- sessionInfo存在:', !!gameData.sessionInfo);
        
        if (gameData.data) {
          console.log('\n🎮 案件数据详情:');
          console.log('- sessionId:', gameData.data.sessionId);
          console.log('- caseData存在:', !!gameData.data.caseData);
          
          if (gameData.data.caseData) {
            const caseData = gameData.data.caseData;
            console.log('- case存在:', !!caseData.case);
            console.log('- suspects存在:', !!caseData.suspects);
            console.log('- initialClues存在:', !!caseData.initialClues);
            
            if (caseData.case) {
              console.log('\n📋 案件信息:');
              console.log('- 标题:', caseData.case.title);
              console.log('- 地点:', caseData.case.location);
              console.log('- 受害者:', caseData.case.victim);
              console.log('- 真凶ID:', caseData.case.culpritId);
            }
            
            if (caseData.suspects) {
              console.log('\n👥 嫌疑人信息:');
              console.log('- 数量:', caseData.suspects.length);
              caseData.suspects.forEach((suspect, index) => {
                console.log(`  ${index + 1}. ${suspect.name} - ${suspect.personality} (可疑度: ${suspect.suspicionLevel}/10)`);
              });
            }
            
            if (caseData.initialClues) {
              console.log('\n🔍 初始线索:');
              console.log('- 数量:', caseData.initialClues.length);
              caseData.initialClues.forEach((clue, index) => {
                console.log(`  ${index + 1}. ${clue.description} (重要性: ${clue.importance}/10)`);
              });
            }
          }
        }
        
        return {
          success: true,
          gameData,
          message: '案件生成测试成功'
        };
      } else {
        console.log('❌ 工具结果中没有payload.result');
        return {
          success: false,
          error: 'NO_PAYLOAD_RESULT'
        };
      }
    } else {
      console.log('❌ 没有工具调用结果');
      return {
        success: false,
        error: 'NO_TOOL_RESULTS'
      };
    }

  } catch (error) {
    console.error('❌ 测试失败:', error);
    return {
      success: false,
      error: error.message
    };
  }
}

async function testDirectCaseGeneration() {
  try {
    console.log('\n📋 测试直接调用案件生成Agent...');
    
    const agent = mastraClient.getAgent('caseGeneratorAgent');
    const result = await agent.generateVNext({
      messages: [
        {
          role: 'user',
          content: `请生成一个normal难度的推理案件。
          
主题偏好：办公室谋杀案
嫌疑人数量：3

请使用 generate-case 工具来创建完整的案件数据，包括：
1. 案件基本信息（标题、描述、地点、时间等）
2. 3个嫌疑人的详细信息
3. 相应数量的初始线索

确保案件逻辑严密，所有嫌疑人都有合理的动机和不在场证明。`
        }
      ]
    });

    console.log('✅ 案件生成Agent响应成功');
    console.log('📝 响应文本长度:', result.text?.length || 0);
    
    // 等待工具调用完成
    const toolResults = await result.toolResults;
    console.log('🔧 工具调用数量:', toolResults?.length || 0);
    
    if (toolResults && toolResults.length > 0) {
      const toolResult = toolResults[0];
      console.log('🎯 案件生成工具调用成功');
      
      if (toolResult.payload?.result) {
        const caseData = toolResult.payload.result;
        console.log('📊 案件数据验证:');
        console.log('- case存在:', !!caseData.case);
        console.log('- suspects存在:', !!caseData.suspects);
        console.log('- initialClues存在:', !!caseData.initialClues);
        
        if (caseData.case) {
          console.log('\n📋 生成的案件:');
          console.log('- 标题:', caseData.case.title);
          console.log('- 描述:', caseData.case.description);
          console.log('- 地点:', caseData.case.location);
          console.log('- 受害者:', caseData.case.victim);
        }
        
        return {
          success: true,
          caseData,
          message: '直接案件生成测试成功'
        };
      }
    }
    
    return {
      success: false,
      error: 'NO_CASE_DATA'
    };

  } catch (error) {
    console.error('❌ 直接案件生成测试失败:', error);
    return {
      success: false,
      error: error.message
    };
  }
}

async function runAllTests() {
  console.log('🎯 开始全面测试修复后的案件生成功能...\n');
  
  const results = {
    gameFlow: await testCaseGeneration(),
    directCase: await testDirectCaseGeneration()
  };

  console.log('\n' + '='.repeat(60));
  console.log('📊 案件生成修复测试报告');
  console.log('='.repeat(60));

  const successCount = Object.values(results).filter(r => r?.success).length;
  const totalTests = Object.keys(results).length;

  console.log(`🎯 成功率: ${successCount}/${totalTests} (${Math.round(successCount/totalTests*100)}%)`);
  console.log(`🎮 游戏流程测试: ${results.gameFlow?.success ? '✅ 成功' : '❌ 失败'}`);
  console.log(`🔧 直接案件生成测试: ${results.directCase?.success ? '✅ 成功' : '❌ 失败'}`);

  if (successCount === totalTests) {
    console.log('\n🎉 所有测试通过！案件生成问题已完全修复！');
    console.log('✅ API调用方式已更新');
    console.log('✅ 数据访问路径已修复');
    console.log('✅ 降级方案已完善');
    console.log('🚀 可以进行完整的浏览器端测试了！');
  } else if (successCount > 0) {
    console.log('\n👍 部分功能正常，继续调试其他问题');
    Object.entries(results).forEach(([test, result]) => {
      if (!result?.success) {
        console.log(`- ${test} 失败: ${result?.error}`);
      }
    });
  } else {
    console.log('\n⚠️  所有测试都失败，需要进一步调试');
    Object.entries(results).forEach(([test, result]) => {
      console.log(`- ${test} 失败: ${result?.error}`);
    });
  }

  console.log('\n🔧 修复总结:');
  console.log('- 更新了Agent的工具调用结果访问方式');
  console.log('- 修复了toolResults的异步处理');
  console.log('- 添加了Agent名称配置');
  console.log('- 完善了降级方案');

  console.log('\n' + '='.repeat(60));
  return results;
}

runAllTests().catch(error => {
  console.error('❌ 测试运行失败:', error);
  process.exit(1);
});
